import axios from 'axios'
import { useUserStore } from '@/stores/user'
import { showToast } from 'vant'

// 不需要token验证的接口配置（游客可访问）
// 注意：这里的路径需要匹配实际的 config.url，可能不包含 baseURL 部分
const NO_AUTH_APIS = {
	// 登录相关接口
	login: [
		/\/api\/user\/login(ByLLTCode)?$/,
		/\/user\/login(ByLLTCode)?$/, // 去掉baseURL后的路径
		/\/api\/auth\//,
		/\/auth\//,
	],
	// 公开接口
	public: [/\/api\/bizPollutionSourceInfo\/listall/, /\/bizPollutionSourceInfo\/listall/],
	// 法律法规（游客可访问，不需要token）
	regulation: [
		/\/api\/form\/regulation\//, // 完整路径
		/\/form\/regulation\//, // 去掉baseURL后的路径
	],
}

/**
 * 检查接口是否需要token验证
 * @param {string} url 请求URL
 * @returns {boolean} true-需要验证, false-不需要验证
 */
const needTokenAuth = (url) => {
	// 检查所有不需要验证的接口
	const allNoAuthPatterns = [...NO_AUTH_APIS.login, ...NO_AUTH_APIS.public, ...NO_AUTH_APIS.regulation]

	// 添加调试日志
	const isNoAuth = allNoAuthPatterns.some((pattern) => pattern.test(url))
	if (url.includes('regulation')) {
		console.log('法律法规接口检查:', url, '需要token:', !isNoAuth)
	}

	return !isNoAuth
}

// 创建axios实例
const request = axios.create({
	baseURL: import.meta.env.VITE_APP_BASE_API || '/api',
	timeout: 10000,
})

// 请求拦截器
request.interceptors.request.use(
	async (config) => {
		const userStore = useUserStore()

		// 检查是否需要token验证
		const needAuth = needTokenAuth(config.url)

		// 公开接口：不需要token，直接放行
		if (!needAuth) {
			console.log('公开接口，无需token:', config.url)
			return config
		}

		// 私有接口：需要token验证
		let token = userStore.token

		// 如果没有token，尝试自动登录
		if (!token) {
			console.log('私有接口需要token，尝试自动登录:', config.url)
			try {
				await userStore.ensureLogin()
				token = userStore.token
			} catch (e) {
				// code 过期或未授权，直接抛出异常，避免死循环
				console.error('自动登录失败，需重新授权', e)
				throw e
			}
		}

		// 设置token和请求头
		if (token) {
			config.headers['token'] = token
			config.headers['Accept'] = 'application/json'
		}

		return config
	},
	(error) => {
		console.error('请求拦截器错误:', error)
		return Promise.reject(error)
	}
)

// 响应拦截器
request.interceptors.response.use(
	(response) => {
		const res = response.data

		// 参考小程序的响应处理
		if (['0', 0, '50001', '50002', '50003'].includes(res.code)) {
			return res
		} else if (res.code === '40001') {
			// token过期，需要重新登录
			localStorage.removeItem('token')
			// 获取应用的基础路径，跳转到正确的首页
			const basePath = import.meta.env.VITE_BASE_PATH || '/'
			window.location.href = basePath
			return Promise.reject(new Error('登录已过期'))
		} else if (res.code === '500') {
			console.error('系统异常:', res.message || '系统异常')
			return Promise.reject(new Error(res.message || '系统异常'))
		} else if (res.code === '40002') {
			console.error('权限不足:', res.msg || '权限不足')
			return Promise.reject(new Error(res.msg || '权限不足'))
		} else {
			console.error('接口错误:', res.message || res.msg || '请求失败')
			return Promise.reject(new Error(res.message || res.msg || '请求失败'))
		}
	},
	(error) => {
		console.error('响应拦截器错误:', error)

		if (error.message === 'Network Error') {
			showToast('网络异常，请稍后再试')
		}

		if (error.response?.status === 401) {
			// token过期，跳转到登录页
			localStorage.removeItem('token')
			// 获取应用的基础路径，跳转到正确的首页
			const basePath = import.meta.env.VITE_BASE_PATH || '/'
			window.location.href = basePath
		}

		return Promise.reject(error)
	}
)

export default request

// 便捷方法导出（与小程序使用方式对齐）
export const get = (url, params = {}, config = {}) => {
	return request({ method: 'get', url, params, ...config })
}
export const post = (url, data = {}, config = {}) => {
	return request({ method: 'post', url, data, ...config })
}
